/**
 * 微信小程序登录示例文件
 * 这是一个推荐的微信小程序登录实现方式
 */

// LeanCloud配置信息
const LEANCLOUD_CONFIG = {
  APP_ID: 'UhRgTlt0jH0D69h7nJeCxoMz-gzGzoHsz',
  APP_KEY: 'dC90fu68TK6ARLxC4zd8aPE2',
  API_SERVER: 'https://uhrgtlt0.lc-cn-n1-shared.com',
};

// 微信小程序配置
const WECHAT_CONFIG = {
  APP_ID: 'wx0280ba8b92e95307',
  APP_SECRET: 'ed025e06d96b985fdf447e92f24c5c3b'
};

// 获取请求头
function getHeaders() {
  return {
    'X-LC-Id': LEANCLOUD_CONFIG.APP_ID,
    'X-LC-Key': LEANCLOUD_CONFIG.APP_KEY,
    'Content-Type': 'application/json'
  };
}

/**
 * 微信登录函数
 * 按照官方推荐流程实现:
 * 1. 调用wx.login获取临时登录凭证code
 * 2. 将code发送到后端换取用户身份标识
 * 3. 通过用户身份标识生成登录态
 */
function wechatLogin() {
  return new Promise((resolve, reject) => {
    // 显示加载提示
    wx.showLoading({
      title: '登录中...',
    });
    
    // 调用微信登录获取code
    wx.login({
      success: (res) => {
        if (res.code) {
          console.log('获取微信code成功:', res.code);
          
          // 将code发送到服务器
          wx.request({
            url: `${LEANCLOUD_CONFIG.API_SERVER}/1.1/users`,
            method: 'POST',
            header: getHeaders(),
            data: {
              authData: {
                weapp: {
                  code: res.code,
                  platform: 'weapp',
                  app_id: WECHAT_CONFIG.APP_ID,
                  app_secret: WECHAT_CONFIG.APP_SECRET
                }
              }
            },
            success: (loginRes) => {
              if (loginRes.statusCode >= 200 && loginRes.statusCode < 300) {
                // 注册成功，保存登录态
                saveLoginState(loginRes.data);
                resolve(loginRes.data);
              } else if (loginRes.statusCode === 401 || (loginRes.data && loginRes.data.code === 202)) {
                // 用户已存在，尝试登录
                console.log('用户已存在，尝试登录');
                loginExistingUser(res.code, resolve, reject);
              } else {
                // 其他错误
                console.error('登录失败:', loginRes);
                reject(new Error(loginRes.data ? loginRes.data.error : '登录失败'));
              }
            },
            fail: (error) => {
              console.error('请求失败:', error);
              reject(error);
            },
            complete: () => {
              wx.hideLoading();
            }
          });
        } else {
          wx.hideLoading();
          console.error('获取code失败:', res);
          reject(new Error('获取微信登录凭证失败'));
        }
      },
      fail: (error) => {
        wx.hideLoading();
        console.error('微信登录失败:', error);
        reject(error);
      }
    });
  });
}

/**
 * 登录已存在的用户
 */
function loginExistingUser(code, resolve, reject) {
  wx.request({
    url: `${LEANCLOUD_CONFIG.API_SERVER}/1.1/login`,
    method: 'POST',
    header: getHeaders(),
    data: {
      authData: {
        weapp: {
          code: code,
          platform: 'weapp',
          app_id: WECHAT_CONFIG.APP_ID,
          app_secret: WECHAT_CONFIG.APP_SECRET
        }
      }
    },
    success: (res) => {
      if (res.statusCode >= 200 && res.statusCode < 300) {
        // 登录成功，保存登录态
        saveLoginState(res.data);
        resolve(res.data);
      } else {
        console.error('登录失败:', res);
        reject(new Error(res.data ? res.data.error : '登录失败'));
      }
    },
    fail: (error) => {
      console.error('请求失败:', error);
      reject(error);
    }
  });
}

/**
 * 保存登录状态
 */
function saveLoginState(userData) {
  if (userData && userData.sessionToken) {
    // 保存用户信息和登录态
    wx.setStorageSync('leancloud_session_token', userData.sessionToken);
    wx.setStorageSync('leancloud_user_id', userData.objectId);
    console.log('登录成功，用户信息已保存');
  }
}

/**
 * 检查登录状态
 */
function checkLoginStatus() {
  const sessionToken = wx.getStorageSync('leancloud_session_token');
  if (!sessionToken) {
    return Promise.resolve(null);
  }
  
  return new Promise((resolve, reject) => {
    wx.request({
      url: `${LEANCLOUD_CONFIG.API_SERVER}/1.1/users/me`,
      method: 'GET',
      header: {
        ...getHeaders(),
        'X-LC-Session': sessionToken
      },
      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data);
        } else {
          // 会话已失效，清除本地存储
          wx.removeStorageSync('leancloud_session_token');
          wx.removeStorageSync('leancloud_user_id');
          resolve(null);
        }
      },
      fail: (error) => {
        console.error('获取用户信息失败:', error);
        reject(error);
      }
    });
  });
}

/**
 * 退出登录
 */
function logout() {
  wx.removeStorageSync('leancloud_session_token');
  wx.removeStorageSync('leancloud_user_id');
  return Promise.resolve();
}

// 导出模块
module.exports = {
  login: wechatLogin,
  checkLoginStatus: checkLoginStatus,
  logout: logout
}; 